Nhảy tới nội dung

Các API của luồng cập nhật thông tin

1. API khởi tạo phiên

1.1. Request Url

POST base_url/session/init

Nếu sử dụng FPT AI eKYC SDK, bạn sử dụng URL sau:

POST base_url/init_session

1.2. Request Headers

Tham sốYêu cầuGiá trị mặc địnhMô tả
api-keyAPI key để sử dụng hệ thống FPT AI eKYC
client_uuidKhôngUUID sinh ra từ hệ thống của khách hàng để tự quản lý phiên eKYC
device-typeThiết bị đang sử dụng, các giá trị cho phép bao gồm:
  • android
  • ios
  • web-sdk
only-engineKhôngĐặt giá trị bằng 1 khi sử dụng luồng chỉ OCR
sdk-versionKhôngStringPhiên bản của FPT AI eKYC SDK. Nên sử dụng tham số này để đảm bảo hiệu quả khi sử dụng SDK

1.3. Mẫu request

curl --location --request POST 'base_url/session/init' \
--header 'api-key: your-api-key' \
--header 'device-type: android' \
--header 'client_uuid: your-uuid'

1.4. Response

1.4.1. Mẫu response

  • Thành công: http_code = 200
{
"code": "200",
"message": "success",
"session-id": "7760a743-884b-4195-b781-892e72c7b0b6",
}
  • Thất bại: http_code != 200

1.4.2. Mô tả response

Tham sốLoại dữ liệuMô tảGhi chú
codestringMã trạng thái trả về của yêu cầu200: Thành công
messagestringThông báo lỗi trả về (nếu có)
  • 200: Thành công
  • 401: Lỗi xác thực
  • 403: Lỗi dùng sai session-id
  • 504: Lỗi kết nối hệ thống
  • 500: Lỗi server hệ thống
session-idstringMã ID duy nhất của phiên eKYC được sinh ra bởi eKYC Backend. session-id sau đó phải được gửi kèm trong headers của tất cả các request trong cùng phiên

2. API OCR

2.1. Request Url

POST base_url/ocr

2.2. Request Headers

Tham sốYêu cầuLoại dữ liệuMô tảChú ý
session-idStringID duy nhất của phiên eKYC nhận được từ bước khởi tạo phiên
api-keyStringAPI key để sử dụng hệ thống FPT AI eKYC
device-typeStringThiết bị đang sử dụng, các giá trị cho phép bao gồm:
  • android
  • ios
  • web-sdk
document-typeStringLoại giấy tờ sử dụng. Có 3 loại được hỗ trợ:
  • Căn cước công dân/Chứng minh nhân dân: idr
  • Hộ chiếu: passport
  • Giấy phép lái xe: dlr
side-typeKhôngStringTùy chọn này dành cho trường hợp client muốn gửi từng mặt của giấy tờ lên server eKYC để xử lý ngay sau khi chụp, thay vì đợi chụp đủ cả hai mặt. Các giá trị bao gồm:
  • front (mặt trước)
  • back (mặt sau)
Lưu ý rằng ảnh mặt trước phải được gửi trước.
langKhôngStringNgôn ngữ sử dụng, các giá trị cho phép bao gồm:
  • en
  • vi
mặc định: en
get-detail-responseKhôngStringBao gồm dữ liệu thô của mô hình AI trong kết quả trả về (trong trường detail_response).
  • Giá trị 1: Bao gồm dữ liệu đầu ra thô của mô hình AI trong phản hồi
  • Nếu đặt thành bất kỳ giá trị nào khác hoặc nếu header này không được cung cấp, dữ liệu thô sẽ không được trả
sdk-versionKhôngStringPhiên bản của FPT AI eKYC SDK. Nên sử dụng tham số này để đảm bảo hiệu quả khi sử dụng SDK

2.3. Request Body

FormData chứa các ảnh cho truy vấn. Ảnh mặt trước phải được cung cấp trước ảnh mặt sau. Nếu document-typepassport hoặc sử dụng side-type trong headers, khách hàng chỉ cung cấp 1 ảnh cho hệ thống trong mỗi request.

Tham sốYêu cầuGiá trị mặc địnhMô tả
filesFile ảnhẢnh chụp mặt trước của giấy tờ
filesFile ảnhẢnh chụp mặt sau của giấy tờ

2.4. Mẫu request

curl --location --request POST 'base_url/ocr' \
--header 'api-key: your api-key' \
--header 'session-id: 7760a743-884b-4195-b781-892e72c7b0b6' \
--header 'device-type: android' \
--header 'document-type: idr' \
--header 'lang: vi' \
--form 'files=@"path-to-front.jpg"' \
--form 'files=@"path-to-back.jpg"'

2.5. Response

2.5.1. Mẫu response

  • Thành công
{
"errorCode": "0",
"errorMessage": "",
"data": [
{
"key": "ID",
"name": "Số/ No",
"value": "xxxxx",
"score": "98.66",
"locale": "vn"
},
{
"key": "Name",
"name": "Họ và tên",
"value": "your name,
"score": "99.71",
"locale": "vn"
},
{
"key": "Date of birth",
"name": "Ngày sinh",
"value": "dd/mm/yyyy",
"score": "98.41",
"locale": "vn"
},
{
"key": "Sex",
"name": "Giới tính",
"value": "NAM",
"score": "98.30",
"locale": "vn"
},
{
"key": "Nationality",
"name": "Quốc tịch",
"value": "VIỆT NAM",
"score": "99.77",
"locale": "vn"
},
{
"key": "Home",
"name": "Quê quán",
"value": "X, Y NAM ĐỊNH",
"score": "96.54",
"locale": "vn"
},
{
"key": "Address",
"name": "Địa chỉ",
"value": "X, Y NAM ĐỊNH",
"score": "98.27",
"locale": "vn"
},
{
"key": "Expired Date",
"name": "Ngày hết hạn",
"value": "dd/mm/yyyy",
"score": "98.93",
"locale": "vn"
},
{
"key": "Type",
"name": "Loại",
"value": "7",
"score": "N/A",
"locale": "vn"
},
{
"key": "Province",
"name": "Tỉnh/Thành Phố",
"value": "NAM ĐỊNH",
"score": "N/A",
"locale": "vn"
},
{
"key": "District",
"name": "Quận/ Huyện",
"value": "Y,
"score": "N/A",
"locale": "vn"
},
{
"key": "Ward",
"name": "Phường/Xã",
"value": "X",
"score": "N/A",
"locale": "vn"
},
{
"key": "Features",
"name": "Đặc điểm nhận dạng",
"value": "SẸO CHẤM ,
"score": "99.78",
"locale": "vn"
},
{
"key": "Issue Date",
"name": "Ngày cấp",
"value": "dd/mm/yyyy",
"score": "99.31",
"locale": "vn"
},
{
"key": "Issue Location",
"name": "Nơi cấp",
"value": "CỤC TRƯỞNG CỤC CẢNH SÁT QUẢN LÝ HÀNH CHÍNH VỀ TRẬT TỰ XÃ HỘI",
"score": "95.40",
"locale": "vn"
}
],
"total_data": []
}

2.5.2. Mô tả response

Tham sốLoại dữ liệuMô tảGhi chú
errorCodeIntegerMã lỗi trả về từ server. errorCode = 0 nghĩa là yêu cầu thành công. Ngược lại, yêu cầu có lỗi.Chi tiết có thể tìm thấy trong tài liệu mã lỗi
errorMessageStringThông báo lỗi của yêu cầu (nếu có). Ngôn ngữ của thông báo được đặt bởi tham số lang trong headers
dataObjectChứa kết quả OCR

2.5.3. Mẫu response lỗi

  • Phiên làm việc hết hạn: Trả về khi phiên không hợp lệ, ví dụ như: phiên chưa được đăng ký, phiên hết thời gian chờ, không khớp loại thiết bị, ...
{
"errorCode": "403",
"errorMessage": "Phiên làm việc đã hết hạn"
}
  • Lỗi OCR
{
"errorCode": "3",
"errorMessage": "Không tìm thấy tài liệu đã chọn trong ảnh"
}

3. API kiểm tra liveness và so khớp khuôn mặt

3.1. Request Url

POST base_url/face/liveness

3.2. Request Headers

Tham sốYêu cầuLoại dữ liệuMô tảChú ý
session-idStringID duy nhất của phiên eKYC nhận được từ bước khởi tạo phiên
api-keyStringAPI key để sử dụng hệ thống FPT AI eKYC
autoKhôngstringĐặt giá trị là True khi gửi từ FPT SDK. Nếu không phải đặt False
device-typeStringThiết bị đang sử dụng, các giá trị cho phép bao gồm:
  • android
  • ios
  • web-sdk
langKhôngStringNgôn ngữ sử dụng, các giá trị cho phép bao gồm:
  • en
  • vi
mặc định: en
sdk-versionKhôngStringPhiên bản của FPT AI eKYC SDK. Nên sử dụng tham số này để đảm bảo hiệu quả khi sử dụng SDK

3.3. Request Body

FormData chứa ảnh hoặc video selfie sử dụng để kiểm tra.

Tham sốYêu cầuLoại dữ liệuMô tả
selfiesKhông. Sử dụng selfies hoặc videoArrayẢnh selfie được chụp để kiểm tra liveness và thực hiện so khớp khuôn mặt
videoKhông. Sử dụng selfies hoặc videoFileVideo selfie được quay để kiểm tra liveness và thực hiện so khớp khuôn mặt

3.4. Mẫu request

curl --location --request POST 'base_url/face/liveness' \
--header 'api-key: your-api-key' \
--header 'session-id: 7760a743-884b-4195-b781-892e72c7b0b6'
--header 'device-type: android' \
--header 'lang: vi' \
--form 'selfies=@"path-to-selfie-image"' \

3.5. Response

3.5.1. Mẫu response

  • Thành công
{
"code": "200",
"message": "Kiểm tra thực thể sống thành công",
"liveness": {
"code": "200",
"message": "liveness check successful",
"is_live": "true",
"spoof_prob": "N/A",
"need_to_review": "N/A",
"is_deepfake": "N/A",
"deepfake_prob": "N/A",
"warning": "N/A",
},
"face_match": {
"code": "200",
"message": "face matching successful",
"isMatch": "true",
"similarity": "95.84",
"warning": "N/A"
},
"is_complete_session": false
}

3.5.2. Mô tả response

Tham sốLoại dữ liệuMô tảGhi chú
codeStringMã trạng thái trả về của yêu cầu. Mã 200 nghĩa là yêu cầu thành công.Chi tiết có thể được tìm thấy trong tài liệu mã lỗi
messageStringThông báo lỗi của yêu cầu (nếu có). Ngôn ngữ của thông báo được đặt bởi tham số lang trong headers
livenessObjectKết quả kiểm tra liveness trả về
face_matchObjectKết quả so khớp khuôn mặt trả về
is_complete_sessionbooleanXác định xem phiên đã hoàn thành hay chưa. Nếu False, người dùng có thể thử lại với xác minh khuôn mặt, nếu không, người dùng phải thử với một phiên khác

3.5.3. Mẫu response lỗi

  • Khuôn mặt không khớp với giấy tờ: Trả về khi khuôn mặt trong ảnh selfie không khớp với khuôn mặt trong ảnh giấy tờ.
{
"code": "303",
"message": "Khuôn mặt không khớp với giấy tờ",
"liveness": {
"code": "200",
"message": "liveness check successful",
"is_live": "true",
"spoof_prob": "N/A",
"need_to_review": "N/A",
"is_deepfake": "N/A",
"deepfake_prob": "N/A",
"warning": "N/A",
},
"face_match": {
"code": "303",
"message": "face is not matching with document",
"isMatch": "false",
"similarity": "5.84",
"warning": "N/A"
},
"is_complete_session": false
}
  • Có 2 khuôn mặt: Trả về khi hệ thống phát hiện nhiều hơn một khuôn mặt trong ảnh selfie.
{
"code": "407",
"message": "2 faces exist",
"liveness": {
"code": "200",
"message": "liveness check successful",
"is_live": "true",
"spoof_prob": "N/A",
"need_to_review": "N/A",
"is_deepfake": "N/A",
"deepfake_prob": "N/A",
"warning": "N/A",
},
"face_match": {
"code": "407",
"message": "2 faces exist",
"isMatch": "N/A",
"similarity": "N/A",
"warning": "N/A"
},
"is_complete_session": false
}

4. API kiểm tra data NFC

4.1. Request Url

POST base_url/check_chip

4.2. Request Headers

Tham sốYêu cầuLoại dữ liệuMô tảChú ý
session-idStringID duy nhất của phiên nhận được từ request khởi tạo phiên
api-keyStringAPI key của bạn để xác thực với hệ thống FPT AI eKYC
autoStringĐặt giá trị là True khi gọi từ FPT SDK. Ngược lại, đặt là False
device-typeStringThiết bị của bạn, các giá trị bao gồm:
  • android
  • ios
langKhôngStringNgôn ngữ sử dụng, các giá trị bao gồm:
  • en: Tiếng Anh
  • vi: Tiếng Việt
Mặc định: en
sdk-versionKhôngStringPhiên bản của FPT AI eKYC SDK. Nên sử dụng tham số này để đảm bảo hiệu quả khi sử dụng SDK

4.3. Request Body

ParameterRequiredTypeDescription
dg1String base64Thông tin MRZ
dg2String base64Ảnh chân dung
dg3String base64Vân tay trái
dg4String base64Vân tay phải
dg5String base64Vùng nhớ chưa sử dụng
dg6String base64Vùng nhớ chưa sử dụng
dg7String base64Vùng nhớ chưa sử dụng
dg8String base64Vùng nhớ chưa sử dụng
dg9String base64Vùng nhớ chưa sử dụng
dg10String base64Vùng nhớ chưa sử dụng
dg11String base64Vùng nhớ chưa sử dụng
dg12String base64Vùng nhớ chưa sử dụng
dg13String base64Thông tin cơ bản của công dân
dg14String base64Chứa các tùy chọn bảo mật cho các cơ chế bảo mật bổ sung
dg15String base64Khóa công khai lưu trữ
dg16String base64Vùng nhớ chưa sử dụng
sodString base64Chữ ký số
challengeString base64
aAResultString base64Thử thách ngẫu nhiên (mảng byte [8] gửi đến NFC Chip để thực hiện xác thực (Active Authentication)
eACCAResultString base64
comString base64
expired-dateKhôngStringNgày hết hạn
fatherKhôngStringTên cha
featuresKhôngStringĐặc điểm
homeKhôngStringNguyên quán
idKhôngStringSố căn cước công dân
issue-dateKhôngStringNgày cấp
motherKhôngStringTên mẹ
nameKhôngStringTên
nationKhôngStringQuốc gia
nationalityKhôngStringQuốc tịch
prev-numberKhôngStringSố CMND cũ
religionKhôngStringTôn giáo
sexKhôngStringGiới tính
addressKhôngStringĐịa chỉ
faceKhôngString base64Ảnh chân dung
qrcodeKhôngStringmã qrcode

4.4. Mẫu request

curl --location --request POST 'base-url/check_chip' \
--header 'api-key: your api key' \
--header 'session-id': 'your session id' \
--header 'device-type': 'android'\
--header 'lang': 'vi'\
--header 'Content-Type: application/json' \
--data '{
"dg1": "...",
"dg2": "...",
"dg3": "...",
...
}'

4.5. Response

4.5.1. Mẫu response

  • Thành công
{
"errorCode": "0",
"errorMessage": "",
"valid": false,
"verifyCode": 2,
"verifyMessage": "Chưa xác thực thông tin C06",
"rar_request_id": "N/A",
"data": [
{
"key": "ID",
"name": "Số/ No",
"value": "xxxxxxxxxxx",
"score": "N/A",
"locale": "vn"
},
{
"key": "PrevID",
"name": "Số định danh trước kia",
"value": " xxxxxxxxxxx ",
"score": "N/A",
"locale": "vn"
},
{
"key": "Name",
"name": "Họ & tên",
"value": "Phạm Hoàng Tùng",
"score": "N/A",
"locale": "vn"
},
...
]
}

4.5.2. Mô tả response

Tham sốLoại dữ liệuMô tảGhi chú
errorCodeStringMã lỗi trả về từ server. errorCode = 0 nghĩa là yêu cầu thành công. Ngược lại, yêu cầu gặp lỗi.Chi tiết có thể tìm thấy trong tài liệu mã lỗi
errorMessageStringThông báo lỗi của yêu cầu (nếu có). Ngôn ngữ của thông báo được đặt bởi tham số lang trong headers
validBoolean
  • True: Xác thực C06 thành công
  • False: Chưa thực hiện xác thực C06
verifyCodeString
  • 1: Xác thực thành công
  • 0: Xác thực thất bại
  • 2: Chưa xác thực
verifyMessageStringThông báo xác thực

5. API nhận thông tin QR Code

5.1. Request Url

POST base_url/qrcode

5.2. Request Headers

ParameterRequiredData typeDescriptionNote
session-idStringID duy nhất của phiên nhận được từ request khởi tạo phiên
api-keyStringAPI key của bạn để xác thực với hệ thống FPT AI eKYC
device-typeStringThiết bị của bạn, các giá trị bao gồm:
  • android
  • ios
langKhôngStringNgôn ngữ sử dụng, các giá trị bao gồm:
  • en: Tiếng Anh
  • vi: Tiếng Việt
Mặc định: en
sdk-versionKhôngStringPhiên bản của FPT AI eKYC SDK

5.3. Request Body

ParameterRequiredTypeDescription
qrcodeStringThông tin trong QR code

5.4. Mẫu request

curl --location --request POST 'base_url/qrcode' \
--header 'Content-Type: application/json' \
--header 'api-key: your api-key' \
--header 'session-id: 7760a743-884b-4195-b781-892e72c7b0b6' \
--header 'device-type: android' \
--header 'lang: vi' \
--data-raw '{
"qrcode": "0461990xxxxx|xxxxxxx|Nguyễn Văn A|060619.....
}'

5.5. Response

5.5.1. Mẫu response

  • Thành công
{
"errorCode": "0",
"errorMessage": ""
}
  • Thất bại

    • Phiên làm việc hết hạn: Trả về khi phiên không hợp lệ, ví dụ như: phiên chưa được đăng ký, phiên hết thời gian chờ, không khớp loại thiết bị, ...

      {
      "errorCode": "403",
      "errorMessage": "Phiên làm việc đã hết hạn"
      }
    • Lỗi QRcode:

      {
      "errorCode": "QR01",
      "errorMessage": "Dữ liệu trong mã QR không khớp"
      }

5.5.2. Mô tả response

Tham sốLoại dữ liệuMô tảGhi chú
errorCodeStringMã lỗi trả về từ server. errorCode = 0 nghĩa là request thành công. Ngược lại, request gặp lỗi.
errorMessageStringThông báo lỗi của request (nếu có). Ngôn ngữ của thông báo được đặt bởi tham số lang trong headers

6. API Logging & Tracing

API này được thiết kế để phục vụ cho việc ghi log và truy vết exception ở phía SDK.
Thông thường, SDK không gửi bất kỳ dữ liệu nào. Việc ghi log chỉ được kích hoạt thông qua cấu hình ở Portal.

  • Trong quá trình gọi API init_session, server có thể trả về một flag:

    { "enable_tracing": true }
  • Nếu enable_tracing = true, SDK sẽ bắt đầu gửi thông tin log và exception qua API này.

  • Nếu enable_tracing = false (hoặc không có flag này), SDK sẽ không được phép gửi thông tin log và exception.

Cơ chế này đảm bảo rằng việc ghi log chỉ được kích hoạt trong các trường hợp debug hoặc error, giúp lập trình viên thu thập thông tin truy vết chi tiết mà không gây tốn tài nguyên trong quá trình vận hành thông thường.

6.1. Request Url

POST base_url/logging/tracing

6.2. Request Headers

Tham sốYêu cầuLoại dữ liệuMô tảChú ý
session-idKhôngStringID duy nhất của phiên eKYC nhận được từ bước khởi tạo phiên
api-keyStringAPI key để sử dụng hệ thống FPT AI eKYC
device-typeKhôngStringThiết bị đang sử dụng, các giá trị cho phép bao gồm:
  • android
  • ios
  • web-sdk
Cần thêm các tham số này nếu như thông tin log được gửi từ nhiều client khác nhau
langNoStringNgôn ngữ sử dụng, các giá trị cho phép bao gồm:
  • en
  • vi
Cần thêm các tham số này nếu như thông tin log được gửi từ nhiều client khác nhau
Mặc định: en
sdk-versionNoStringVersion of FPT AI eKYC SDK. Cần thêm các tham số này nếu như thông tin log được gửi từ nhiều client khác nhau
Content-TypeYesStringXác định loại nội dung của request bodyBắt buộc là application/json

6.3. Request Body

Tham sốLoại dữ liệuYêu cầuMô tả
eventstringKhôngTên hoặc hành động của sự kiện (ví dụ: face.liveness.start).
levelstringKhôngMức độ log debug, info, warn, error, fatal.
messagestringKhôngThông điệp mô tả
timestampstring (ISO 8601)KhôngThời điểm xảy ra sự kiện phía client. Server sẽ tự gán giá trị nếu không có.
duration_msnumberKhôngThời gian thực hiện cho các tác vụ có thời gian đo (miliseconds)
attributesobjectKhôngTập các cặp key-value tùy chỉnh(ví dụ: device info, user context).
session_metaobjectKhôngMetadata bổ sung của phiên eKYC (ví dụ:{ sdk: "android", version: "1.2.3" }).
trace_idstringKhôngMã định danh liên kết cho việc truy vết
span_idstringKhôngMã định danh của span trong trace (nếu có).
exceptionobjectKhôngChi tiết exception/error (Chi tiết bên dưới).

Exception object

Tham sốLoại dữ liệuYêu cầuMô tả
typestringKhôngLoại Exception hoặc tên class (ví dụ:NullPointerException).
messagestringKhôngThông điệp mô tả
stacktracestringKhôngThông tin stack trace
filestringKhôngTên source file nơi xảy ra lỗi
linenumberKhôngSố dòng trong file nơi xảy ra lỗi
codestringKhôngMã lỗi (nếu có)
handledbooleanKhôngtrue nếu exception đã được truy vết/xử lý, false nếu chưa.
detailobjectKhôngFree-form JSON object chứa thông tin bổ sung (nếu SDK có thể gửi thêm bất kỳ dữ liệu nào).

6.4. Request Sample

curl --location --request POST '<base_url>/logging/tracing' \
--header 'api-key: your-api-key' \
--header 'session-id: 7760a743-884b-4195-b781-892e72c7b0b6' \
--header 'Content-Type: application/json' \
--data '{
"event": "face.match",
"level": "error",
"message": "Face match failed on SDK",
"timestamp": "2025-10-03T04:15:23.412Z",
"attributes": {
"device_type": "android",
"os_version": "14",
"sdk_version": "2.4.0"
},
"exception": {
"type": "IllegalArgumentException",
"message": "Invalid image format",
"stacktrace": "com.fpt.sdk.FaceMatch.process(FaceMatch.java:102)\ncom.fpt.sdk.MainActivity.onResult(MainActivity.kt:45)",
"file": "FaceMatch.java",
"line": 102,
"handled": true,
"detail": {}
}
}'

6.5. Response

6.5.1. Response Sample

  • Succeeded

http_code = 200

{
"code": "200",
"message": "Success"
}
  • Failed

http_code != 200